home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / asmbler.arc / UTIL.INC < prev   
Text File  |  1988-11-19  |  10KB  |  484 lines

  1. NUL     EQU     0
  2. TAB     EQU     9
  3. LF      EQU     10
  4. CR      EQU     13
  5.  
  6. STDIN   EQU     0
  7. STDOUT  EQU     1
  8. STDERR  EQU     2
  9. STDAUX  EQU     3
  10. STDPRN  EQU     4
  11.  
  12.  
  13. PSP     STRUC
  14. INTVECT DW      ?
  15. TOM     DW      ?
  16. RES1    DB      ?
  17. DOSLONG DB      5 DUP (?)
  18. TERMINA DD      ?
  19. CTRLBRK DD      ?
  20. CRITERR DD      ?
  21. DOS1    DB      22 DUP (?)
  22. ENVIRO  DW      ?
  23. DOS2    DB      46 DUP (?)
  24. FPA1    DB      16 DUP (?)
  25. FPA2    DB      20 DUP (?)
  26. UPA     DB      128 DUP (?)
  27. PSP     ENDS
  28.  
  29. DTA     STRUC
  30. DOS3    DB      21 DUP (?)
  31. ATTRIB  DB
  32. TIME    DW
  33. DATE    DW
  34. LSIZE   DW
  35. HSIZE   DW
  36. FNAME   DB      13 DUP (?)
  37. DTA     ENDS
  38.  
  39. EXECDEF STRUC
  40. NENVIRO DW
  41. COMMND  DW      2 DUP (0)
  42. FCB5CH  DW      2 DUP (0)
  43. FCB6CH  DW      2 DUP (0)
  44. EXECDEF ENDS
  45.  
  46. SCANPARAM       MACRO   P1,P2
  47.         LOCAL   SC1
  48.         MOV     AL,' '
  49.         JCXZ    P2
  50.         REPE    SCASB
  51.         JCXZ    P2
  52.         MOV     P1,DI
  53.         DEC     P1
  54.         REPNE   SCASB
  55.         JCXZ    SC1
  56.         DEC     DI
  57. SC1:    MOV     BYTE PTR [DI],NUL
  58.         INC     DI
  59.         ENDM
  60.  
  61. MSCANSWITCH     MACRO
  62. SCANSWITCH:
  63.         ???
  64.         RET
  65.         ENDM
  66.  
  67. MSCANARGS        MACRO
  68.         LOCAL   DEND,ARGBUF,ERR1,NXT0,NXT1,NXT2,NXT3,NXT4,NXT5,SPACE
  69. SCANARGS:
  70.         MOV     ARGC,0
  71.         CLD
  72.         MOV     DI,OFFSET ARGBUF
  73.         MOV     SI,OFFSET UPA
  74.         LODSB                   ; Skip past length
  75.         ; ch = getch();
  76.         LODSB
  77. NXT0:   ; loop {
  78.         ; while (ch == ' ') ch = getch();
  79. SPACE:  CMP     AL,' '
  80.         JNE     NXT1
  81.         LODSB
  82.         JMP     SPACE
  83. NXT1:   ; break when (ch == \nl)
  84.         CMP     AL,CR
  85.         JE      DEND
  86.         ; argv[argc++] = &buff[i];
  87.         MOV     BX,ARGC
  88.         SAL     BX,1
  89.         INC     ARGC
  90.         MOV     ARGV[BX],DI
  91.         ; if (ch == '"') {
  92.         CMP     AL,'"'
  93.         JNE     NXT2
  94.         ; ch = getch();
  95.         LODSB
  96.         CMP     AL,CR
  97.         JE      ERR1
  98.         ; loop {
  99. NXT3:   ; while (ch != '"') { putch(ch); ch = getch(); }
  100.         CMP     AL,'"'
  101.         JE      NXT4
  102.         STOSB
  103.         LODSB
  104.         CMP     AL,CR
  105.         JE      ERR1
  106.         JMP     NXT3
  107. NXT4:   ; ch = getch();
  108.         LODSB
  109.         ; break when (ch != '"');
  110.         CMP     AL,'"'
  111.         JNE     NXT5
  112.         ; putch(ch);
  113.         STOSB
  114.         ; ch = getch();
  115.         LODSB
  116.         CMP     AL,CR
  117.         JE      ERR1
  118.         ; }
  119.         JMP     NXT3
  120. NXT2:   ; } else
  121.         ; while (ch != ' ' && ch != '"' && ch != \nl) {
  122.         CMP     AL,' '
  123.         JE      NXT5
  124.         CMP     AL,'"'
  125.         JE      NXT5
  126.         CMP     AL,CR
  127.         JE      NXT5
  128.         ; putch(ch);
  129.         STOSB
  130.         ; ch = getch();
  131.         LODSB
  132.         ; No error here if we get the CR
  133.         ; }
  134.         JMP     NXT2
  135.         ; }
  136. NXT5:   ; putch(\nul);
  137.         MOV     AH,AL
  138.         MOV     AL,NUL
  139.         STOSB
  140.         MOV     AL,AH
  141.         ; }
  142.         JMP     NXT0
  143. DEND:   RET
  144. ERR1:   MOV     AL,20
  145.         JMP     ERROR
  146.         EVEN
  147. ARGC    DW      0
  148. ARGV    DW      32 DUP (0)
  149. ARGBUF  DB      128 DUP (0)
  150.         ENDM
  151.  
  152. MSKIPWHITE      MACRO
  153.         LOCAL   NXT1,NXT2
  154. SKIPWHITE:
  155.         CMP     BYTE PTR [SI],' '
  156.         JE      NXT1
  157.         CMP     BYTE PTR [SI],TAB
  158.         JNE     NXT2
  159. NXT1:   INC     SI
  160.         DEC     CX
  161.         JCXZ    NXT2
  162.         JMP     SKIPWHITE
  163. NXT2:   RET
  164.         ENDM
  165.  
  166. MCOPYSTR        MACRO
  167.         LOCAL   ERR1,SPACE,NXT1
  168. COPYSTR:
  169.         PUSH    DS
  170.         POP     ES
  171.         JCXZ    ERR1
  172.         PUSH    CX
  173.         PUSH    DI
  174.         MOV     DI,SI
  175.         REPNE   SCASB
  176.         POP     DI
  177.         MOV     AX,CX
  178.         POP     CX
  179.         PUSH    AX
  180.         SUB     CX,AX
  181.         REP     MOVSB
  182.         MOV     BYTE PTR [DI-1],NUL
  183.         POP     CX
  184.         RET
  185. ERR1:   MOV     AL,20
  186.         JMP     ERROR
  187.         ENDM
  188.  
  189. MSKIPSTR        MACRO
  190.         LOCAL   ERR1
  191. SKIPSTR:
  192.         PUSH    DS
  193.         POP     ES
  194.         PUSH    DI
  195.         MOV     DI,SI
  196.         JCXZ    ERR1
  197.         REPNE   SCASB
  198.         MOV     SI,DI
  199.         POP     DI
  200.         RET
  201. ERR1:   MOV     AL,20
  202.         JMP     ERROR
  203.         ENDM
  204.  
  205. MREPLACE        MACRO
  206.         LOCAL   NXT1
  207. REPLACE:
  208.         REPNE   SCASB
  209.         JNE     NXT1
  210.         MOV     BYTE PTR [DI-1],AH
  211.         JMP     REPLACE
  212. NXT1:   RET
  213.         ENDM
  214.  
  215. MSETSWITCH      MACRO
  216. SETSWITCH:
  217.         ; NEW SWITCH IN DL
  218.         MOV     AH,37H          ; INTERNAL CALL         GET SWITCHAR
  219.         MOV     AL,1            ; 1 = SET SWITCHAR ??
  220.         INT     21H
  221.         RET
  222.         ENDM
  223.  
  224. MGETSWITCH      MACRO
  225. GETSWITCH:
  226.         MOV     AH,37H          ; INTERNAL CALL         GET SWITCHAR
  227.         MOV     AL,0            ; 1 = SET SWITCHAR ??
  228.         INT     21H
  229.         ; SWITCH IN DL
  230.         RET
  231.         ENDM
  232.  
  233. MCMPDATE        MACRO
  234.         LOCAL   CMP1
  235. CMPDATE:
  236.         ; DX:CX ? ES:DI
  237.         MOV     AX,ES
  238.         CMP     AX,DX
  239.         JNZ     CMP1
  240.         CMP     DI,CX
  241. CMP1:   RET
  242.         ENDM
  243.  
  244. MREAD   MACRO
  245.         LOCAL   ERR1
  246. READ:
  247.         MOV     AH,3FH
  248.         INT     21H
  249.         JC      ERR1
  250.         RET
  251. ERR1:   JMP     ERROR
  252.         ENDM
  253.  
  254. MSHRINKSPACE    MACRO
  255.         LOCAL   ERR1
  256. SHRINKSPACE:
  257.         MOV     AH,4AH
  258.         INT     21H
  259.         JC      ERR1
  260.         RET
  261. ERR1:   JMP     ERROR
  262.         ENDM
  263.  
  264. MOPEN   MACRO
  265.         LOCAL   ERR1
  266. OPEN:
  267.         MOV     AH,3DH
  268.         INT     21H
  269.         JC      ERR1
  270.         RET
  271. ERR1:   JMP     ERROR
  272.         ENDM
  273.  
  274. MCLOSE  MACRO
  275.         LOCAL   ERR1
  276. CLOSE:
  277.         MOV     AH,3EH
  278.         INT     21H
  279.         JC      ERR1
  280.         RET
  281. ERR1:   JMP     ERROR
  282.         ENDM
  283.  
  284. MGETDATE        MACRO
  285.         LOCAL   ERR1
  286. GETDATE:
  287.         MOV     AH,57H
  288.         MOV     AL,0
  289.         INT     21H
  290.         JC      ERR1
  291.         RET
  292. ERR1:   JMP     ERROR
  293.         ENDM
  294.  
  295. MEXECOMM        MACRO
  296.         LOCAL   EXECBLK,ERR1,SPSAVE,SSSAVE
  297. EXECOMM:
  298.         PUSH    AX
  299.         PUSH    BX
  300.         PUSH    CX
  301.         PUSH    DX
  302.         PUSH    SI
  303.         PUSH    DI
  304.         PUSH    BP
  305.         PUSH    DS
  306.         PUSH    ES
  307.         MOV     SPSAVE,SP
  308.         MOV     SSSAVE,SS
  309.         MOV     EXECBLK.NENVIRO,0
  310.         MOV     EXECBLK.COMMND[0],DX
  311.         MOV     EXECBLK.COMMND[2],DS
  312.         MOV     AX,CS
  313.         MOV     ES,AX
  314.         MOV     BX,OFFSET EXECBLK
  315.         XOR     BP,BP
  316.         MOV     AX,[BP].ENVIRO
  317.         MOV     DS,AX
  318.         MOV     DX,8
  319.         MOV     AH,4BH
  320.         MOV     AL,0
  321.         INT     21H
  322.         MOV     SS,CS:SSSAVE
  323.         MOV     SP,CS:SPSAVE
  324.         POP     ES
  325.         POP     DS
  326.         POP     BP
  327.         POP     DI
  328.         POP     SI
  329.         POP     DX
  330.         POP     CX
  331.         POP     BX
  332.         POP     AX
  333.         JC      ERR1
  334.         RET
  335. ERR1:   JMP     ERROR
  336.         EVEN
  337. EXECBLK EXECDEF <>
  338. SPSAVE  DW
  339. SSSAVE  DW
  340.         ENDM
  341.  
  342. MFIRSTFILE      MACRO
  343.         ENDM
  344.  
  345. MNEXTFILE       MACRO
  346. NEXTFILE:
  347.         MOV     AH,4FH
  348.         INT     21H
  349.         RET
  350.         ENDM
  351.  
  352. MWRITEINT       MACRO
  353.         LOCAL   OUT,RECRS,TEMPBUF
  354. FWRITEINT:
  355.         PUSH    SI
  356.         PUSH    DX
  357.         PUSH    DI
  358.         MOV     DI,OFFSET TEMPBUF
  359.         MOV     SI,10
  360.         CALL    RECRS
  361.         MOV     BYTE PTR [DI],NUL
  362.         MOV     DX,OFFSET TEMPBUF
  363.         CALL    FWRITESTR
  364.         POP     DI
  365.         POP     DX
  366.         POP     SI
  367.         RET
  368. RECRS:  TEST    AX,AX
  369.         JZ      OUT
  370.         XOR     DX,DX
  371.         DIV     SI
  372.         PUSH    DX
  373.         CALL    RECRS
  374.         POP     AX
  375.         ADD     AL,'0'
  376.         STOSB
  377. OUT:    RET
  378. TEMPBUF DB      12 DUP (0)
  379.         ENDM
  380.  
  381. MWRITESTR       MACRO
  382. FWRITESTR:
  383.         PUSH    AX
  384.         PUSH    DI
  385.         PUSH    CX
  386.         MOV     DI,DX
  387.         MOV     CX,32767
  388.         MOV     AL,NUL
  389.         REPNE   SCASB
  390.         SUB     CX,32767
  391.         NEG     CX
  392.         DEC     CX
  393.         MOV     AH,40H
  394.         INT     21H
  395.         POP     CX
  396.         POP     DI
  397.         POP     AX
  398.         RET
  399.         ENDM
  400.  
  401. MWRITELN        MACRO
  402.         LOCAL   CRLF
  403. FWRITELN:
  404.         PUSH    CX
  405.         PUSH    DX
  406.         PUSH    AX
  407.         MOV     DX,OFFSET CRLF
  408.         MOV     CX,2
  409.         MOV     AH,40H
  410.         INT     21H
  411.         POP     AX
  412.         POP     DX
  413.         POP     CX
  414.         RET
  415. CRLF    DB      CR,LF
  416.         ENDM
  417.  
  418. MNORMAL MACRO
  419. NORMAL:
  420.         MOV     AL,0
  421.         MOV     AH,4CH
  422.         INT     21H
  423.         ENDM
  424.  
  425.  
  426. MKERR   MACRO   P1,P2
  427. ERR&P1  DB      P2,NUL
  428.         ENDM
  429.  
  430. ERRSTR  MACRO   P1
  431.         MKERR   %ERRLB,P1
  432. ERRLB   = ERRLB + 1
  433.         ENDM
  434.  
  435. ERRLBL  MACRO   P1
  436.         DW      ERR&P1
  437.         ENDM
  438.  
  439. MERROR  MACRO
  440. ERROR:  XOR     AH,AH
  441.         PUSH    AX
  442.         MOV     BX,AX
  443.         SAL     BX,1
  444.         MOV     DX,ERRTABLE[BX]
  445.         MOV     BX,STDERR       ; Standard error
  446.         CALL    FWRITESTR
  447.         CALL    FWRITELN
  448.         POP     AX              ; Get the error number
  449.         MOV     AH,4CH
  450.         INT     21H             ; Return to host program
  451.  
  452. ERRLB   = 0
  453.         ERRSTR  'Internal error'                ; 0
  454.         ERRSTR  'Invalid function number'       ; 1
  455.         ERRSTR  'File not found'                ; 2
  456.         ERRSTR  'Path not found'                ; 3
  457.         ERRSTR  'Too many open files'           ; 4
  458.         ERRSTR  'Access denied'                 ; 5
  459.         ERRSTR  'Invalid handle'                ; 6
  460.         ERRSTR  'Memory control blocks destroyed'       ; 7
  461.         ERRSTR  'Insufficient memory'           ; 8
  462.         ERRSTR  'Invalid memory block address'  ; 9
  463.         ERRSTR  'Invalid environment'           ; 10
  464.         ERRSTR  'Invalid format'                ; 11
  465.         ERRSTR  'Invalid access code'           ; 12
  466.         ERRSTR  'Invalid data'                  ; 13
  467.         ERRSTR  '*** UNSPECIFIED ***'           ; 14
  468.         ERRSTR  'Invalid drive was specified'   ; 15
  469.         ERRSTR  'Attempted to remove current directory' ; 16
  470.         ERRSTR  'Not same device'               ; 17
  471.         ERRSTR  'No more files'                 ; 18
  472.         ERRSTR  'Invalid number of parameters'  ; 19
  473.         ERRSTR  'Syntax error'                  ; 20
  474.  
  475. ERRX    = 1
  476.  
  477. ERRTABLE DW     ERR0
  478.         REPT    ERRLB-1
  479.         ERRLBL  %ERRX
  480. ERRX    = ERRX + 1
  481.         ENDM
  482.  
  483.         ENDM
  484.